interface TreeNode {
  [key: string]: any;
  children?: TreeNode[];
}
/**
 * 查找树形数据中是否存在指定属性的目标值
 * @param tree 树形数据（可以是单节点或节点数组）
 * @param prop 要查找的属性名
 * @param targetValue 要匹配的目标值
 * @returns 是否存在该属性值
 */
export function hasTargetValueInTree(
  tree: TreeNode | TreeNode[],
  prop: string,
  targetValue: any
): boolean {
  // 如果是数组，遍历每个元素
  if (Array.isArray(tree)) {
    for (const node of tree) {
      if (hasTargetValueInTree(node, prop, targetValue)) {
        return true;
      }
    }
    return false;
  }
  // 检查当前节点是否包含目标属性和值
  if (tree[prop] === targetValue) {
    return true;
  }
  // 递归检查子节点
  if (tree.children && tree.children.length > 0) {
    return hasTargetValueInTree(tree.children, prop, targetValue);
  }
  // 没有找到
  return false;
}

/**
 * 从树形数据中根据指定属性查找对应的值(常用于翻译)
 * @param tree 树形数据
 * @param propName 要匹配的属性名
 * @param propValue 要匹配的属性值
 * @param targetProp 要返回的目标属性名，默认与propName相同
 * @returns 找到的属性值，如果未找到则返回null
 */
export function getTargetFromTree(
  tree: TreeNode[],
  propName: string,
  propValue: any,
  targetProp?: string
): any | null {
  // 如果未指定目标属性，默认返回匹配属性的值
  const target = targetProp || propName;

  // 使用栈实现迭代式深度优先搜索
  const stack = [...tree];

  while (stack.length > 0) {
    const node = stack.pop()!;

    // 检查当前节点是否匹配
    if (node[propName] === propValue) {
      return node[target];
    }

    // 将子节点加入栈（倒序加入以保持原有顺序）
    if (node.children && node.children.length > 0) {
      for (let i = node.children.length - 1; i >= 0; i--) {
        stack.push(node.children[i]);
      }
    }
  }

  // 未找到匹配节点
  return null;
}
